﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BIZMA._controls;
using BIZModel;
using BL.BIZControls;
using System.Web.Security;
using BIZMA.BL.Security;

namespace BIZMA._controls.Files
{
    public partial class List_Folders : BIZListControl, IBIZControlDefaultMethods
    {
        #region Default
        public void DefaultListLoad()
        {
            
        }

        public void DefaultListLoad(Guid Id, string loadByType)
        {
            if (loadByType.ToUpper() == LoadByFunctionRootFolder)
            {
                LoadOnlyByFunctionRootFolder(Id);
            }
            else if (loadByType.ToUpper() == LoadByCheckRootOnSected)
            {
                LoadRootFromCurrent(Id);
            }
            else if (loadByType.ToUpper() == LoadByRoot)
            {
                LoadByRootFolder(Id);
            }
            else
            {
                throw new NotImplementedException();
            }
        }

        public void DefaultEditNew()
        {
            throw new NotImplementedException();
        }

        public void DefaultEditNew(Guid Id, string editByType)
        {
            throw new NotImplementedException();
        }

        public void DefaultEditLoad(Guid Id)
        {
            throw new NotImplementedException();
        }

        /// <summary>
        /// Sätter denna mapp (id) som root och laddar allt under
        /// </summary>
        public const string LoadByRoot = "ROOT";
        /// <summary>
        /// Laddar alla mappar med samma (id) rootfolder. OM det finns nya rootfoldrar under denna tas de ej med
        /// </summary>
        public const string LoadByFunctionRootFolder = "ROOTFOLDER";
        /// <summary>
        /// Kollar rootfolder på id och sätter den som  LoadByRoot
        /// </summary>
        public const string LoadByCheckRootOnSected = "SELECTED";

        #endregion


        private bool CanAddFolderPopup { get { return ViewState["CanAddFolderPopup"] != null ? (bool)ViewState["CanAddFolderPopup"] : false; } set { ViewState["CanAddFolderPopup"] = value; } }

        //OLIKA ID properties som styr frågan för listan tex om man ska hämta utifrån EmployeeId eller PlanningId
        //Styrs av publika metoder
        private Guid RootId { get { return ViewState["RootID"] != null ? (Guid)ViewState["RootID"] : Guid.Empty; } set { ViewState["RootID"] = value; } }
        private bool OnlyRooFolderType { get { return ViewState["OnlyRooFolderType"] != null ? (bool)ViewState["OnlyRooFolderType"] : false; } set { ViewState["OnlyRooFolderType"] = value; } }
        

        //Olika filter för frågan till listan kan tex vara om man ska visa alla eller aktiva, eller datum mmm
        //Filter sätter man innan man kör de publika metorder som sätter ID properties som finns ovan
        /// <summary>
        /// Sök efter användare som innehåller detta
        /// </summary>
        //public string FilterBy_Name { get { return ViewState["FilterBy_Name"] != null ? (string)ViewState["FilterBy_Name"] : ""; } set { ViewState["FilterBy_Name"] = value; } }
        //public string FilterBy_GroupType { get { return ViewState["FilterBy_GroupType"] != null ? (string)ViewState["FilterBy_GroupType"] : ""; } set { ViewState["FilterBy_GroupType"] = value; } }


        #region This dialog
        protected void Page_Load(object sender, EventArgs e)
        {
            FillActionList();
        }

        /// <summary>
        /// Utför ändringar i kontrollen utifrån de inställningar som gjort tex MultiSelect, PickerControl, Edit mm
        /// Funktionen körs automatiskt när listan laddas om den inte kört innan
        /// Exempel på hur man använder
        /// Skapa ett event på att kontrollen laddas (men gör det i metoden där kontrollen läggs till eftersom du bara vill trigga detta en gång)
        /// mContainer.BIZControlLoaded += new ControlLoaded(mContainer_BIZControlLoaded);
        /// mContainer.AddDefaultListLoad(BIZControl.FolderList, SelectedId, List_Folders.LoadByCheckRootOnSected);
        /// 
        /// Gör lite inställningar på kontrollen tex:
        /// ((List_Folders)mContainer.ContainedControl).MultipleSelect = false;
        /// ((List_Folders)mContainer.ContainedControl).SelectedItems.Clear();
        /// ((List_Folders)mContainer.ContainedControl).SelectedItems.Add(SelectedId);
        /// </summary>
        public void ApplySettings()
        {
            //Gör sådant som man gör på pageload här typ fyll "statisk" dropdown med värden mm 
            InitLoaded = true;
            FillActionList();
        }


        protected override void OnInit(EventArgs e)
        {
            base.ActionDropDown = selAction.ActionList;
            base.ListControl = lv;

            base.OnInit(e);

            base.NeedsData += new NeedsDataHandler(List_NeedsData);

            //här gör man alla init inställningar typ lägga till eventhandlers och annat som styr sidan

            if (ContainerControl != null)
            {
                ContainerControl.Title = "Mappar";
                ContainerControl.ShowButtons(false, false, false, false);

                if (ModalContainerControl != null)
                {
                    ModalContainerControl.Width = 800;
                    ModalContainerControl.Height = 500;
                }
            }

            CanAddFolderPopup = mcFolder.CanAddPopupControl(BIZControl.Folder);
            mcFolder.ModalClosing += new ModalControlClosing(Modal_Closing);

            ListDataBound += new EventHandler<ListViewItemEventArgs>(List_ListDataBound);
            lv.DataBound += new EventHandler(lv_DataBound);
            lv.LayoutCreated += new EventHandler(lv_LayoutCreated);
            selAction.DoAction += new DoActionHandler(selAction_DoAction);
        }

        void Modal_Closing(object sender, EventArgs e)
        {
            LoadList(false);
        }

        void List_NeedsData(bool sorting)
        {
            LoadList(sorting);
        }


        private void FillActionList()
        {
            selAction.Items.Clear();

            selAction.Items.Add(new ListItem("--Välj åtgärd--", "-"));
            if (PickerControl)
            {
                selAction.Items.Add(new ListItem("Välj", "SEL"));
                selAction.Items.Add(new ListItem("-------", "-"));
                selAction.SelectedValue = "SEL";
            }
            selAction.Items.Add(new ListItem("Radera", "DEL"));
           
           

        }

        #endregion
        #region list

        /// <summary>
        /// Här rensas alla id properties som används för frågan till listan
        /// </summary>
        private void ResetIdProperties()
        {
            RootId = Guid.Empty;
            OnlyRooFolderType = false;

            lv.DataSource = null;
            lv.DataBind();
        }

        /// <summary>
        /// Laddar allt under denna mapp
        /// </summary>
        /// <param name="rootId">rootmappen för listan</param>
        public void LoadByRootFolder(Guid rootId)
        {
            ResetIdProperties();
            
            RootId = rootId;
            OnlyRooFolderType = false;

            CheckPermissionAndLoad();
        }
        /// <summary>
        /// Laddar allt under root som har samma rootfolderid
        /// </summary>
        /// <param name="rootId">rootmappen för listan och den rootfolder som man filtrerar</param>
        public void LoadOnlyByFunctionRootFolder(Guid rootId)
        {
            ResetIdProperties();
            RootId = rootId;
            OnlyRooFolderType = true;
            CheckPermissionAndLoad();
        }

        /// <summary>
        /// Hämtar rootFolder för inskickad mapp och hämtar allt från den mappen
        /// </summary>
        /// <param name="currentId">Mapp utifrån man ska hitta rootfolderId</param>
        public void LoadRootFromCurrent(Guid currentId)
        {
            //häma root folder id
            //else

            //rooten på arkivet
            Guid rootId = BaseBL.FOLDERS_ROOT;

            BIZMAEntities ent = BaseBL.GetEnt();
            BIZModel.Folder folder = ent.Folders.FirstOrDefault(q => q.FolderId == currentId);

            if (folder != null)
            {
                if (folder.FunctionRootFolder.HasValue)
                {
                    rootId = folder.FunctionRootFolder.Value;
                }
            }


            ResetIdProperties();
            RootId = rootId;
            OnlyRooFolderType = false;
            CheckPermissionAndLoad();
        }


        private void CheckPermissionAndLoad()
        {
            if (RootId == Guid.Empty)
            {
                throw new ArgumentException("RootId saknas!","RootId");
            }

            //läsa rootmapp eller filearchive admin
            if(SecurityBL.HasObjectFunction(RootId,SecurityBL.OBJECTTYPE_FOLDER,SecurityBL.OBJFUNCTION_FOLDER_READ,SecurityBL.SYSFUNCTION_SYSTEM_FILEARCHIVE) == false)
            {
                throw new AccessViolationException("Du har inte rättigheter till den här mappen");
            }
           
            LoadList(true);
        }

        /// <summary>
        /// Metod som ansvarar för att fylla listan med värden utifrån vilken publik load metod som körts innan
        /// </summary>
        /// <param name="sorting">Talar om ifall sortering ska ändras eller om man ska använda tidigare sortering</param>
        private void LoadList(bool sorting)
        {
            if (!InitLoaded)
            {
                ApplySettings();
            }

            BIZMAEntities ent = BaseBL.GetEnt();
            IEnumerable<Navigation> query = null;

            if(SecurityBL.HasSysFunction(SecurityBL.SYSFUNCTION_SYSTEM_FILEARCHIVE))
            {
                 query =  ent.Folder_GetFullNavTree(RootId,OnlyRooFolderType).ToArray();
            }
            else
            {
                query =  ent.Folder_GetNavTree(RootId,OnlyRooFolderType,BaseBL.UserId,SecurityBL.OBJFUNCTION_FOLDER_READ).ToArray();
            }
            
            lv.DataSource = query;

            lv.DataBind();

            //if (!sorting)
            //    lv.ReSort(ViewState);
        }

        int pNL = 0;
        bool isFirstNode = true;
        Control prevUl = null;
        Literal litEndHtml = null;

        void lv_LayoutCreated(object sender, EventArgs e)
        {
            litEndHtml = (Literal)((ListView)sender).FindControl("litEndHtml");
        }

        void List_ListDataBound(object sender, ListViewItemEventArgs e)
        {

            Navigation nav = (Navigation)e.Item.DataItem;
            Literal litHtml = (Literal)e.Item.FindControl("litHtml");

            int NL = nav.NodeLevel.HasValue ? nav.NodeLevel.Value : 0;

            
            //första nivån
            if (NL == 0 && pNL == 0)
            {
                litHtml.Text = "";
            }
            else if (NL > pNL)
            {
                litHtml.Text = "<ul class=\"closed\">";
            }
            else if (NL == pNL)
            {
                litHtml.Text = "</li>";
            }
            else if (NL < pNL)
            {
                litHtml.Text = "</li>";

                for (int i = 0; i < pNL - NL; i++)
                {
                    litHtml.Text =  litHtml.Text + "</ul></li>";
                }
            }

            pNL = NL;

            ////göm alla funktioner för systemgrupper om man inte har rättigheter att administrera det
            //if (SystemGroupsPermission == false && ((bool)DataBinder.Eval(e.Item.DataItem, "IsSystemGroup")) == true)
            //{


            //    Control chkSel = (LinkButton)e.Item.FindControl("chkSel");
            //    Control btnSel = (LinkButton)e.Item.FindControl("btnSel");
            //    LinkButton lkb1 = (LinkButton)e.Item.FindControl("lkb1");
            //    LinkButton lkb2 = (LinkButton)e.Item.FindControl("lkb2");

            //    chkSel.Visible = false;
            //    btnSel.Visible = false;
            //    lkb1.Enabled = false;
            //    lkb2.Enabled = false;

            //    lkb1.ToolTip = "Du har inte behörighet till systemgrupper";
            //    lkb2.ToolTip = lkb1.ToolTip;
            //}

        }

        void lv_DataBound(object sender, EventArgs e)
        {
            litEndHtml.Text  = "";

            for (int i = 0; i < pNL ; i++)
            {
                if((pNL -i) > 1)
                    litEndHtml.Text = litEndHtml.Text + "</li></ul>";

                else
                    litEndHtml.Text = litEndHtml.Text + "</li>";
                
            }
        }

        #endregion

        #region detail dialog
        //protected void OpenDetail_Command(object sender, CommandEventArgs e)
        //{
        //    if (HandleListClickEvents)
        //    {
        //        CallHandleClick(this, Guid.Parse(e.CommandArgument.ToString()), null);
        //    }
        //    else
        //    {
        //        if (CanAddGroupPopup)
        //        {
        //            mcGroup.AddDefaultEditLoad(BIZControl.Group, Guid.Parse(e.CommandArgument.ToString()));
        //        }
        //    }

        //}

        //protected void btnNew_Command(object sender, CommandEventArgs e)
        //{
        //    if (HandleNewClickEvent)
        //    {
        //        CallNewHandleClick(this, Guid.Empty, null);
        //    }
        //    else
        //    {
        //        if (CanAddGroupPopup)
        //        {
        //            mcGroup.AddDefaultEditNew(BIZControl.Group);
        //        }
        //    }
        //}

        #endregion
        /// <summary>
        /// Event  när man har knappar för att välja en rad i listan
        /// </summary>
        /// <param name="sender">Knappen som klickats</param>
        /// <param name="e">Knappens CommandEventArgs</param>
        protected void btnSel_Command(object sender, CommandEventArgs e)
        {
            SelectedItems = new List<Guid>();
            SelectedItems.Add(Guid.Parse(e.CommandArgument.ToString()));

            CallListSelect(this, null, MultipleSelect, SelectedItems);

        }
        /// <summary>
        /// Event när man har valt en/flera rader i listan och väljer att utföra något från åtgärdslistan tex (Välj eller radera) 
        /// </summary>
        /// <param name="sender">ActionDropDown</param>
        /// <param name="selectedAction">Det val man har gjort</param>
        void selAction_DoAction(object sender, string selectedAction)
        {
            if (selectedAction != "-")
            {
                if (selectedAction == "SEL")
                {
                    var selectedKeys = lv.GetSelectedDataKeys("btnSel");
                    SelectedItems = new List<Guid>();
                    foreach (DataKey dk in selectedKeys)
                    {
                        Guid contactId = Guid.Parse(dk.Value.ToString());
                        SelectedItems.Add(contactId);
                    }

                    CallListSelect(this, null, MultipleSelect, SelectedItems);
                }
            }


            if (selectedAction != "SEL")
            {
                LoadList(false);
            }
        }

        /// <summary>
        /// Event när man har valt en/flera rader i listan och väljer att utföra något från åtgärdslistan tex (Välj eller radera) 
        /// </summary>
        /// <param name="sender">Knappen utför</param>
        /// <param name="e">EventArgs. Används inte det är vad man valt i ddlAction som är intressant</param>
        protected void btnAction_Click(object sender, EventArgs e)
        {
           

        }

        ///// <summary>
        ///// Event för klick på sökfunktionen
        ///// </summary>
        ///// <param name="sender">Knappen</param>
        ///// <param name="e">Knappens EventArgs</param>
        //protected void btnSearch_Click(object sender, EventArgs e)
        //{
        //    FilterBy_Name = searchName.Text;
        //    FilterBy_GroupType = searchGroupType.SelectedValue;

        //    LoadList(true);
        //}


    }
}